package com.globefrog.framework.log.util;
import com.google.common.collect.Lists;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

/**
 * @author caijinbang
 * @date 2020-11-08 09:31
 */
public class DateExtUtils extends DateUtils {

  private static final Map<String, SimpleDateFormat> DATE_FORMATES = new HashMap<>();
  public static final String YYYY_MM_DD = "yyyy-MM-dd";
  public static final String YYYYMMDD = "yyyyMMdd";
  public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

  /**
   * 获取当前日期.
   *
   * @return 当前日期
   */
  public static Date getCurrentDate() {
    return new Date();
  }

  /**
   * 解析日期.
   *
   * @param date    日期
   * @param pattern 表达式
   * @return 日期字符
   */
  public static String parse(Date date, String pattern) {
    return DateFormatUtils.format(date, pattern);
  }

  /**
   * 获得给定日期凌晨00:00:00.
   *
   * @param date 日期
   * @return 日期
   */
  public static Date getStartDate(Date date) {

    return date;
  }

  /**
   * 获得给定日期晚上23:59:59.
   *
   * @param date 日期
   * @return 日期
   */
  public static Date getEndDate(Date date) {

    return date;
  }


  /**
   * 落在时间范围内，包边界值.
   *
   * @param startDate 开始日期
   * @param endDate   结束日期
   * @param date      校验日期
   * @return 是否在范围内
   */
  public static boolean inDateRange(Date startDate, Date endDate, Date date) {
    if (startDate != null && endDate != null && date != null) {
      return (startDate.before(date) || startDate.equals(date))
          && (endDate.after(date) || endDate.equals(date));
    } else {
      return false;
    }
  }

  /**
   * 落在时间范围内，不包含边界值.
   *
   * @param startDate 开始日期
   * @param endDate   结束日期
   * @param date      校验日期
   * @return 是否在范围内
   */
  public static boolean inDateRange2(Date startDate, Date endDate, Date date) {
    if (startDate != null && endDate != null && date != null) {
      return startDate.before(date) && endDate.after(date);
    } else {
      return false;
    }
  }

  /**
   * 落在时间范围外.
   *
   * @param startDate 开始日期
   * @param endDate   结束日期
   * @param date      校验日期
   * @return 是否在范围内
   */
  public static boolean outDateRange(Date startDate, Date endDate, Date date) {
    if (startDate != null && endDate != null && date != null) {
      return date.before(startDate) || date.after(endDate);
    } else {
      return false;
    }
  }

  /**
   * 获取开始时间和结束时间之间的日期.
   *
   * @param begin 开始日期
   * @param end   结束日期
   * @return 日期集合
   */
  public static List<Date> findDates(Date begin, Date end) {
    List<Date> dates = Lists.newArrayList();
    dates.add(begin);
    Calendar calBegin = Calendar.getInstance();
    // 使用给定的 Date 设置此 Calendar 的时间
    calBegin.setTime(begin);
    Calendar calEnd = Calendar.getInstance();
    // 使用给定的 Date 设置此 Calendar 的时间
    calEnd.setTime(end);
    // 测试此日期是否在指定日期之后
    while (end.after(calBegin.getTime())) {
      // 根据日历的规则，为给定的日历字段添加或减去指定的时间量
      calBegin.add(Calendar.DAY_OF_MONTH, 1);
      dates.add(calBegin.getTime());
    }
    return dates;
  }
}
